home *** CD-ROM | disk | FTP | other *** search
- /*
- * $Id: queue.h,v 1.6 1993/06/04 11:16:15 jraja Exp $
- *
- * Copyright (c) 1993 AmiTCP/IP Group, <amitcp-group@hut.fi>
- * Helsinki University of Technology, Finland.
- * All rights reserved.
- *
- * HISTORY
- * $Log: queue.h,v $
- * Revision 1.6 1993/06/04 11:16:15 jraja
- * Fixes for first public release.
- *
- * Revision 1.5 1993/05/17 01:02:04 ppessi
- * Changed RCS version
- *
- * Revision 1.4 1993/03/03 18:43:17 jraja
- * Cleanup. Removed some unneeded definitions (The 'old' queue stuff).
- *
- * Revision 1.3 93/03/03 12:33:05 12:33:05 jraja (Jarno Tapio Rajahalme)
- * Fixed comments.
- *
- * Revision 1.2 93/02/04 18:16:19 18:16:19 jraja (Jarno Tapio Rajahalme)
- * commented out some obsolete definitions.
- *
- * Revision 1.1 92/11/20 15:42:31 15:42:31 jraja (Jarno Tapio Rajahalme)
- * Initial revision
- *
- *
- */
-
- /*
- * Mach Operating System
- * Copyright (c) 1992 Carnegie Mellon University
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
- * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie Mellon
- * the rights to redistribute these changes.
- */
- /*
- * HISTORY
- * Log: queue.h,v
- * Revision 2.1 92/04/21 17:17:51 rwd
- * BSDSS
- *
- *
- */
-
- #ifndef SYS_QUEUE_H
- #define SYS_QUEUE_H
-
- /*
- * Queue of abstract objects. Queue is maintained
- * within that object.
- *
- * Supports fast removal from within the queue.
- *
- * How to declare a queue of elements of type "foo_t":
- * In the "*foo_t" type, you must have a field of
- * type "queue_chain_t" to hold together this queue.
- * There may be more than one chain through a
- * "foo_t", for use by different queues.
- *
- * Declare the queue as a "queue_t" type.
- *
- * Elements of the queue (of type "foo_t", that is)
- * are referred to by reference, and cast to type
- * "queue_entry_t" within this module.
- */
-
- /*
- * A generic doubly-linked list (queue).
- */
-
- struct queue_entry {
- struct queue_entry *next; /* next element */
- struct queue_entry *prev; /* previous element */
- };
-
- typedef struct queue_entry *queue_t;
- typedef struct queue_entry queue_head_t;
- typedef struct queue_entry queue_chain_t;
- typedef struct queue_entry *queue_entry_t;
-
- /*
- * enqueue puts "elt" on the "queue".
- * dequeue returns the first element in the "queue".
- * remqueue removes the specified "elt" from the specified "queue".
- */
-
- #define enqueue(queue,elt) enqueue_tail(queue, elt)
- #define dequeue(queue) dequeue_head(queue)
-
- void enqueue_head();
- void enqueue_tail();
- queue_entry_t dequeue_head();
- queue_entry_t dequeue_tail();
- void remqueue();
-
- /*
- * Macro: queue_init
- * Function:
- * Initialize the given queue.
- * Header:
- * void queue_init(q)
- * queue_t q; \* MODIFIED *\
- */
- #define queue_init(q) ((q)->next = (q)->prev = q)
-
- /*
- * Macro: queue_first
- * Function:
- * Returns the first entry in the queue,
- * Header:
- * queue_entry_t queue_first(q)
- * queue_t q; \* IN *\
- */
- #define queue_first(q) ((q)->next)
-
- /*
- * Macro: queue_next
- * Header:
- * queue_entry_t queue_next(qc)
- * queue_t qc;
- */
- #define queue_next(qc) ((qc)->next)
-
- /*
- * Macro: queue_end
- * Header:
- * boolean_t queue_end(q, qe)
- * queue_t q;
- * queue_entry_t qe;
- */
- #define queue_end(q, qe) ((q) == (qe))
-
- #define queue_empty(q) queue_end((q), queue_first(q))
-
- /*
- * Macro: queue_enter
- * Header:
- * void queue_enter(q, elt, type, field)
- * queue_t q;
- * <type> elt;
- * <type> is what's in our queue
- * <field> is the chain field in (*<type>)
- */
- #define queue_enter(head, elt, type, field) \
- { \
- if (queue_empty((head))) { \
- (head)->next = (queue_entry_t) elt; \
- (head)->prev = (queue_entry_t) elt; \
- (elt)->field.next = head; \
- (elt)->field.prev = head; \
- } \
- else { \
- register queue_entry_t prev; \
- \
- prev = (head)->prev; \
- (elt)->field.prev = prev; \
- (elt)->field.next = head; \
- (head)->prev = (queue_entry_t)(elt); \
- ((type)prev)->field.next = (queue_entry_t)(elt);\
- } \
- }
-
- /*
- * Macro: queue_field [internal use only]
- * Function:
- * Find the queue_chain_t (or queue_t) for the
- * given element (thing) in the given queue (head)
- */
- #define queue_field(head, thing, type, field) \
- (((head) == (thing)) ? (head) : &((type)(thing))->field)
-
- /*
- * Macro: queue_remove
- * Header:
- * void queue_remove(q, qe, type, field)
- * arguments as in queue_enter
- */
- #define queue_remove(head, elt, type, field) \
- { \
- register queue_entry_t next, prev; \
- \
- next = (elt)->field.next; \
- prev = (elt)->field.prev; \
- \
- queue_field((head), next, type, field)->prev = prev; \
- queue_field((head), prev, type, field)->next = next; \
- }
-
- /*
- * Macro: queue_assign
- */
- #define queue_assign(to, from, type, field) \
- { \
- ((type)((from)->prev))->field.next = (to); \
- ((type)((from)->next))->field.prev = (to); \
- *to = *from; \
- }
-
- #define queue_remove_first(h, e, t, f) \
- { \
- e = (t) queue_first((h)); \
- queue_remove((h), (e), t, f); \
- }
-
- #define queue_remove_last(h, e, t, f) \
- { \
- e = (t) queue_last((h)); \
- queue_remove((h), (e), t, f); \
- }
-
- /*
- * Macro: queue_enter_first
- * Header:
- * void queue_enter_first(q, elt, type, field)
- * queue_t q;
- * <type> elt;
- * <type> is what's in our queue
- * <field> is the chain field in (*<type>)
- */
- #define queue_enter_first(head, elt, type, field) \
- { \
- if (queue_empty((head))) { \
- (head)->next = (queue_entry_t) elt; \
- (head)->prev = (queue_entry_t) elt; \
- (elt)->field.next = head; \
- (elt)->field.prev = head; \
- } \
- else { \
- register queue_entry_t next; \
- \
- next = (head)->next; \
- (elt)->field.prev = head; \
- (elt)->field.next = next; \
- (head)->next = (queue_entry_t)(elt); \
- ((type)next)->field.prev = (queue_entry_t)(elt);\
- } \
- }
-
- /*
- * Macro: queue_last
- * Function:
- * Returns the last entry in the queue,
- * Header:
- * queue_entry_t queue_last(q)
- * queue_t q; \* IN *\
- */
- #define queue_last(q) ((q)->prev)
-
- /*
- * Macro: queue_prev
- * Header:
- * queue_entry_t queue_prev(qc)
- * queue_t qc;
- */
- #define queue_prev(qc) ((qc)->prev)
-
- #endif /* SYS_QUEUE_H */
-